ORA-12516|数据库连接问题遇到的坑
作者 | JiekeXu
来源 | JiekeXu DBA之路(ID: JiekeXu_IT)
大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起看看 ORA-12516|数据库连接问题,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!
事情是这样的,听我慢慢道来,在一个夜黑风高的周五晚上,出现了……哦,不对,剧本不是这样的哈,回归正题,有两套 Oracle 11g 的单机环境通过搭建 DG switchover 的方式进行迁移,当迁移切换后,数据库状态正常,但应用无法连接,报错 ora-12516 错误,如下图所示:
[66000][12516]
Listener refused the connection with the following error:
ORA-12516, TNS:listener could not find available handler with matching protocol stack
oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12516, TNS:listener could not find available handler with matching protocol stack.
但是自己通过轻松连接的方式测试发现,只有通过主 service_names 可以连接,其他的 service_names 均不能连接。这里的主 service_names 指的就是创建实例时生成的第一个。如下指的就是“jiekexu
”。
SQL> show parameter name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cell_offloadgroup_name string
db_file_name_convert string
db_name string jiekexu
db_unique_name string jiekexu
global_names boolean FALSE
instance_name string jiekexu
lock_name_space string
log_file_name_convert string
optimizer_dynamic_sampling integer 2
processor_group_name string
service_names string jiekexu,test,orcl,scott
service_names 有多个服务名
查看监听状态正常,端口为 1523 .但是就是无法通过例如 test,scott 等的服务名连接,报错均为 ORA-12516,重启监听,注册监听等等,被坑了好久好久。
多番检查没有问题,于是寻求网络,强大的百度对于 ' ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程'错误,无一例外的都是让我修改最大连接数,翻了两页的内容均是一样的结果。
SQL> alter system set processes=300 scope=spfile;
无果,还是放弃百度,寻求 MOS 的帮助,但也没有太大的帮助,重启监听,修改监听参数的等等均没有进展,真可谓是山穷水尽疑无路呐。
柳暗花明又一村
20:30、21:30、22:00 时间花花的就过去了,偶然间看到“local_listener”的作用的一篇文章,【pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,要想让pmon动态注册listener,需要设置local_listener参数。】
SQL> show parameter listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks string
local_listener string
remote_listener string
查看后发现,local_listener 确实为空,没有值,但发现原主库现今的备库中此参数有值不为空。
ALTER SYSTEM SET local_listener='TEST' SCOPE=BOTH;
但奇怪的是 $ORACLE_HOME/network/admin/tnsnames.ora 文件中并没有 local_listener 参数的任何设置,猜测可能什么时候被删除了而没有注意到,故在 tnsnames.ora 此文件中添加
TESTIP =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.0.X.X )(PORT = 1523))
)
然后在数据库中注册 local_listener 然后注册监听
ALTER SYSTEM SET local_listener='TESTIP' SCOPE=BOTH;
ALTER SYSTEM REGISTER;
查看监听,其他的服务名也已经注册上了,当然,有问题之前也是注册上的,这点就比较好奇,不知所以,希望有朋友不吝赐教。但使用轻松连接的方式均可以连接了。由于是事后本文,没有当时的截图,就只能到这里了。非 1521 默认端口,这个坑有点大,稍微不注意就中招了,今天有点时间,先记录一下吧,免得以后再犯同样的问题。
SQL> conn sys/REoracle@10.0.X.X:1523/test as sysdba
Connected.
SQL>
SQL> conn sys/REoracle@10.0.X.X:1523/scott as sysdba
Connected.
SQL>
SQL> conn sys/REoracle@10.0.X.X:1523/orcl as sysdba
Connected.
备注:轻松连接方式指的是:sqlplus user/passwd@db_ip:port/server_names
前面在 tnsnames.ora 此文件中添加的 TESTIP 算是别名,代指等号后面的内容,如果不指定别名,当然也可以直接在注册是写明全部内容,就是有点长。RAC 的 local_listener 一般就是一长串地址,并没有指定别名。
ALTER SYSTEM SET local_listener='(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.0.X.X )(PORT = 1523)))' SCOPE=BOTH;
那么,今天就到这里结尾了,先记录下来,以后有问题在继续跟进吧。如果此文对您有帮助,欢迎点赞、在看与转发,写作不易,坚持写作更不易,您的点赞、转发,举手之劳,便是对作者最大的支持,也能让更多的人受益,感谢!
———————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
腾讯云:https://cloud.tencent.com/developer/user/5645107
———————————————————————————